package com.atguigu.srb.common.exception;

import com.atguigu.srb.common.result.ResponseEnum;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils;

@Slf4j
public abstract class Assert {

    /**
     * 断言对象不为空
     * obj 为空则抛异常
     *
     * @param obj          待检查对象
     * @param responseEnum 响应枚举
     */
    public static void notNull(Object obj, ResponseEnum responseEnum) {
        if (obj == null) {
            log.error("断言失败：对象不能为空，错误码={}，错误信息={}", responseEnum.getCode(), responseEnum.getMessage());
            throw new BusinessException(responseEnum);
        }
    }

    /**
     * 断言对象为空
     * 如果对象obj不为空，则抛出异常
     *
     * @param object       待检查对象
     * @param responseEnum 响应枚举
     */
    public static void isNull(Object object, ResponseEnum responseEnum) {
        if (object != null) {
            log.error("断言失败：对象必须为空，错误码={}，错误信息={}，实际对象={}", responseEnum.getCode(), responseEnum.getMessage(), object);
            throw new BusinessException(responseEnum);
        }
    }

    /**
     * 断言表达式为真
     * 如果不为真，则抛出异常
     *
     * @param expression   待检查表达式
     * @param responseEnum 响应枚举
     */
    public static void isTrue(boolean expression, ResponseEnum responseEnum) {
        if (!expression) {
            log.error("断言失败：表达式必须为真，错误码={}，错误信息={}", responseEnum.getCode(), responseEnum.getMessage());
            throw new BusinessException(responseEnum);
        }
    }

    /**
     * 断言两个对象不相等
     * 如果相等，则抛出异常
     *
     * @param m1           第一个比较对象
     * @param m2           第二个比较对象
     * @param responseEnum 响应枚举
     */
    public static void notEquals(Object m1, Object m2, ResponseEnum responseEnum) {
        if (m1 != null && m1.equals(m2)) {
            log.error("断言失败：两个对象必须不相等，错误码={}，错误信息={}，对象1={}，对象2={}", responseEnum.getCode(), responseEnum.getMessage(), m1, m2);
            throw new BusinessException(responseEnum);
        }
    }

    /**
     * 断言两个对象相等
     * 如果不相等，则抛出异常
     *
     * @param m1           第一个比较对象
     * @param m2           第二个比较对象
     * @param responseEnum 响应枚举
     */
    public static void equals(Object m1, Object m2, ResponseEnum responseEnum) {
        if (m1 == null ? m2 != null : !m1.equals(m2)) {
            log.error("断言失败：两个对象必须相等，错误码={}，错误信息={}，对象1={}，对象2={}", responseEnum.getCode(), responseEnum.getMessage(), m1, m2);
            throw new BusinessException(responseEnum);
        }
    }

    /**
     * 断言参数不为空
     * 如果为空，则抛出异常
     *
     * @param s            待检查字符串
     * @param responseEnum 响应枚举
     */
    public static void notEmpty(String s, ResponseEnum responseEnum) {
        if (StringUtils.isEmpty(s)) {
            log.error("断言失败：字符串不能为空，错误码={}，错误信息={}", responseEnum.getCode(), responseEnum.getMessage());
            throw new BusinessException(responseEnum);
        }
    }
}